package com.tt.common.util;

import java.lang.reflect.Field;

/**
 * 反射工具类
 * getType()： 获取属性声明时类型对象（返回class对象）

	getGenericType() ： 返回属性声的Type类型
	
	getName() ： 获取属性声明时名字
	
	getAnnotations() ： 获得这个属性上所有的注释
	
	getModifiers() ： 获取属性的修饰
	
	isEnumConstant() ： 判断这个属性是否是枚举类
	
	isSynthetic() ： 判断这个属性是否是 复合类
	
	get(Object obj) ： 取得obj对象这个Field上的值
	
	set(Object obj, Object value) ： 向obj对象的这个Field设置新值value
 * 
 * @author 青青
 *
 */
public class ReflectUtil 
{
	public static Object getValue(String filedName,Object obj) throws IllegalArgumentException, IllegalAccessException
	{
		//getFields()：获得某个类的所有的公共（public）的字段，包括父类中的字段。 
		//getDeclaredFields()：获得某个类的所有声明的字段，即包括public、private和proteced，但是不包括父类的申明字段。
		Field[] fileds = obj.getClass().getDeclaredFields();
		Field filed = null;
		for (Field field : fileds)
		{
			//如果有属性和传入的属性相等
			if(field.getName().equals(filedName))
			{
				//将该属性赋值给filed
				filed = field;
				break;
			}
		}
		
		//如果obj中没有属性声明
		if(filed==null)
		{
			return null;
		}
		
		//作用就是让我们在用反射时访问私有变量
		filed.setAccessible(true);
		
		//拿到对象实例的 域成员的值。即获得Father中的filed的值
		return filed.get(obj);
	}
}
